// 包装方法
function addThrottle({ el = null, event = null, handler = null, threshold = 250, model = 0 }) {
    let settimeId;
    let settimeId2;
    let start = Date.now();
    el.addEventListener(event, (model == 0 ? cddThrottle0 : cddThrottle1));
    // 间隔模式
    function cddThrottle0(e) {
        clearTimeout(settimeId);
        settimeId = setTimeout(() => {
            handler(e);
            clearTimeout(settimeId);
        }, threshold);
    }
    // 频率模式
    function cddThrottle1(e) {
        clearTimeout(settimeId2);
        let end = Date.now();
        if (end - start >= threshold) {
            clearTimeout(settimeId2);
            handler(e);
            start = end;
        }
        settimeId2 = setTimeout(() => {
            handler(e);
        }, threshold > 150 ? 100 : threshold);
    }
}
// 节流阀函数
export default class Throttle {
    constructor(option) {
        this.wait = 150;
        this.times = 10;
        this.type = 1; //1基于时间，2基于次数
        if (option) {
            this.wait = option.wait || this.wait;
            this.times = option.times || this.times;
            this.type = option.type || this.type;
        }
    }
    static makeFun(fun, option) {
        const c = new Throttle(option);
        // 时间方式
        if (c.type === 1) {
            return c.byDuration(fun);
        }
        // 次数方式
        return c.byTimes(fun);
    }
    // 时间的节流阀
    byDuration(fun, option) {
        if (option) {
            this.wait = option.wait || this.wait;
            option.before && (option.before());
        }
        // 如果有befor则进行处理
        let tId = 0;
        let tcount = Date.now();
        return (params) => {
            if (Date.now() - tcount >= this.wait) {
                tcount = Date.now();
                // setTimeout(() => {
                fun(params);
                // }, 0);
            }
            // 停止则进行的处理
            clearTimeout(tId);
            tId = setTimeout(() => {
                if (option) {
                    option.after && (option.after());
                }
                fun(params);
            }, Math.max(500, this.wait));
        };
    }
    // 次数节流阀
    byTimes(fun, option) {
        if (option) {
            this.times = option.times || this.times;
            option.before && (option.before());
        }
        let _times = 0;
        let tId = 0;
        return (params) => {
            _times++;
            if (_times >= this.times) {
                _times = 0;
                // setTimeout(() => {
                fun(params);
                // }, 0);
            }
            // 停止则进行的处理
            clearTimeout(tId);
            tId = setTimeout(() => {
                if (option) {
                    option.after && (option.after());
                }
                // 最后执行一下
                fun(params);
            }, 300);
        };
    }
}
export { addThrottle, Throttle };
